package util

import (
	"chat-cli/message"
	"encoding/binary"
	"encoding/json"
	"fmt"
	"net"
)

func ReadPkg(conn net.Conn) (mes message.Message, err error) {
	buf := make([]byte, 8096)
	fmt.Println("等待读取客户端发送的数据")
	//conn.Read  只有在conn没有被关闭的情况下 才会被阻塞
	n, err := conn.Read(buf[:4])
	if n != 4 || err != nil {
		err = fmt.Errorf("open header error %w ", err)
		return
	}
	//根据buf读取的长度转换为一个uint32类型
	pkgLen := binary.BigEndian.Uint32(buf[0:4])
	//根据pkgLen 读取消息内容
	n, err = conn.Read(buf[:pkgLen])
	if n != int(pkgLen) || err != nil {
		err = fmt.Errorf("lost package error %w ", err)
		return
	}
	//一切正常后 把数据反序列化为 message.Message
	err = json.Unmarshal(buf[:pkgLen], &mes)
	if err != nil {
		err = fmt.Errorf("unmarshal pkg error %w ", err)
		return
	}
	return
}

func WritePkg(conn net.Conn, data []byte) (err error) {
	//先发送一个长度给对方
	pkgLen := uint32(len(data))
	var bytes [4]byte
	//这里使用了binary包下的方法 将uint长度值转换为字节数组
	binary.BigEndian.PutUint32(bytes[0:4], pkgLen)
	//发送长度
	n, err := conn.Write(bytes[0:4])
	if n != 4 || err != nil {
		err = fmt.Errorf("conn.write len err =  %w ", err)
		return
	}

	fmt.Println("服务器发送消息长度成功!")

	n, err = conn.Write(data)
	if err != nil || n != int(pkgLen) {
		err = fmt.Errorf("conn.write data err =  %w ", err)
		return
	}
	return
}
